/***********************************************************************
 * Fulguro Example 5 : Beans count
 ***********************************************************************/
#include <flgrCoreTypes.h>
#include <flgrCoreErrors.h>
#include <flgrCoreData.h>
#include <flgrCoreCopy.h>
#include <flgrCoreCompare.h>
#include <flgrCoreIO.h>
#include <flgrArith.h>
#include <flgrImageIO.h>
#include <flgrMeasureBase.h>
#include <flgrMorphoBase.h>

FLGR_Ret flgr_quasi_distance(FLGR_Data2D *imout ,FLGR_Data2D *imresidu, FLGR_Data2D *imin, FLGR_Data2D *nhb) {
  FLGR_Data2D *imEro0 = flgr2d_create_from(imin);
  FLGR_Data2D *imEro1 = flgr2d_create_from(imin);
  FLGR_Data2D *imSub = flgr2d_create_from(imin);
  FLGR_Data2D *imq  = flgr2d_create_from(imin);
  FLGR_Vector *vecvol1 = flgr_vector_create(imin->spp,FLGR_UINT64);
  FLGR_Vector *vecvol2 = flgr_vector_create(imin->spp,FLGR_UINT64);
  FLGR_Vector *vec64 = flgr_vector_create(imin->spp,FLGR_UINT64);
  FLGR_Vector *vec1 = flgr_vector_create(imin->spp,imin->type);
  FLGR_Vector *vec_i = flgr_vector_create(imin->spp,imin->type);
  FLGR_Vector *vec0 = flgr_vector_create(imin->spp,imin->type);
  int i;
  FLGR_Ret ret;

  flgr2d_clear_all(imresidu);
  flgr2d_clear_all(imout);

  flgr2d_copy(imEro0,imin);

  flgr_vector_populate_from_string(vec0, "0");
  flgr_vector_populate_from_string(vec1, "1");
  flgr_vector_populate_from_string(vec64, "1");

  flgr2d_measure_volume(imin,vecvol2);
  flgr_vector_add(vecvol1,vecvol2,vec64);
  i=0;

  while(flgr_get_array_fgUINT64(vecvol1->array,0)>flgr_get_array_fgUINT64(vecvol2->array,0)) {
    i++;
    flgr_vector_copy(vecvol1,vecvol2);
 
    flgr2d_erode(imEro1,imEro0,nhb);
    flgr2d_arith_sub(imSub,imEro0,imEro1);

    flgr_vector_populate_from_scalar(vec_i, &i);
    flgr2d_replace_I_with_I_C_C(imq,imSub,">=",imresidu,vec_i,vec0);

    flgr2d_arith_sup(imout,imout,imq);
    flgr2d_arith_sup(imresidu,imSub,imresidu);

    flgr2d_copy(imEro0,imEro1);
    flgr2d_measure_volume(imEro1, vecvol2);

  }

  flgr2d_measure_volume(imout,vecvol1);
  flgr_vector_populate_from_string(vecvol2, "0");

  while(flgr_get_array_fgUINT64(vecvol1->array,0) != flgr_get_array_fgUINT64(vecvol2->array,0)) {
    flgr_vector_copy(vecvol1,vecvol2);
    flgr2d_erode(imEro0, imout, nhb);
    flgr2d_arith_sub(imSub, imout, imEro0);
    flgr2d_arith_const_addsat_str(imEro1,imEro0,"1");
    flgr2d_replace_I_with_C_I_I(imout,imSub,">",vec1,imEro1,imout);
    flgr2d_measure_volume(imout,vecvol1);    
  }

  flgr2d_destroy(imEro0);
  flgr2d_destroy(imEro1);
  flgr2d_destroy(imSub);
  flgr2d_destroy(imq);

  flgr_vector_destroy(vecvol1);
  flgr_vector_destroy(vecvol2);
  flgr_vector_destroy(vec64);
  flgr_vector_destroy(vec0);
  flgr_vector_destroy(vec1);

  return FLGR_RET_OK;
}


int main(void) {
  FLGR_Data2D *imin,*imqdist, *imresidu;
  FLGR_Data2D *nhb1;
  
  imin        = flgr2d_load_pgm("../../images/gray/beans.pgm");
  imqdist     = flgr2d_create_pixmap_from(imin);
  imresidu    = flgr2d_create_pixmap_from(imin);

  nhb1 = flgr2d_create_neighborhood_from_connexity(imin->spp,imin->type,FLGR_6_CONNEX);

  flgr_quasi_distance(imqdist,imresidu,imin,nhb1);


  flgr2d_save_pgm(imqdist,"qdist.pgm",5);

  flgr2d_destroy(imin);
  flgr2d_destroy(imqdist);
  flgr2d_destroy(imresidu);
  flgr2d_destroy(nhb1);
 
}
